home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / ds5000.md / compatSig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-19  |  5.0 KB  |  229 lines

  1. /*
  2.  * compatSig.c --
  3.  *
  4.  *     Returns the Sprite signal number corresponding to a Unix signal.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  *
  9.  */
  10.  
  11. #ifndef lint
  12. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/mach/ds5000.md/compatSig.c,v 9.3 92/01/06 14:54:25 kupfer Exp $ SPRITE (Berkeley)";
  13. #endif not lint
  14.  
  15. #include <sprite.h>
  16.  
  17. #ifndef NULL
  18. #define NULL 0
  19. #endif
  20.  
  21. #include <compatInt.h>
  22. #include <sig.h>
  23. #include <user/sig.h>
  24. #include <user/sys/signal.h>
  25. #include <machInt.h>
  26. #include <mach.h>
  27.  
  28. #include "compatSig.h"
  29.  
  30.  
  31. /*
  32.  *----------------------------------------------------------------------
  33.  *
  34.  * Compat_UnixSignalToSprite --
  35.  *
  36.  *    Given a Unix signal, return the closest corresponding Sprite signal
  37.  *    number. Signal 0 is special-cased to map to sprite signal 0 (NULL).
  38.  *    Some programs use kill(pid, 0) to see if pid exists....
  39.  *
  40.  * Results:
  41.  *    A Sprite signal number is returned, assuming the Unix signal is
  42.  *    in a valid range.  Note that the Sprite "signal number" may be
  43.  *    NULL (0) if there's no matching signal.
  44.  *
  45.  * Side effects:
  46.  *    None.
  47.  *
  48.  *----------------------------------------------------------------------
  49.  */
  50.  
  51. ReturnStatus
  52. Compat_UnixSignalToSprite(signal, spriteSigPtr)
  53.     int signal;
  54.     int *spriteSigPtr;
  55. {
  56.     if (signal >= 0 && signal <= NSIG) {
  57.     *spriteSigPtr = compat_UnixSigToSprite[signal];
  58.     return(SUCCESS);
  59.     } else {
  60.     return(FAILURE);
  61.     }
  62. }
  63.  
  64.  
  65. /*
  66.  *----------------------------------------------------------------------
  67.  *
  68.  * Compat_SpriteSignalToUnix --
  69.  *
  70.  *    Given a Sprite signal, return the closest corresponding Unix signal
  71.  *    number.
  72.  *
  73.  * Results:
  74.  *    A Unix signal number is returned, assuming the Sprite signal is
  75.  *    in a valid range. 
  76.  *
  77.  * Side effects:
  78.  *    None.
  79.  *
  80.  *----------------------------------------------------------------------
  81.  */
  82. ReturnStatus
  83. Compat_SpriteSignalToUnix(signal, unixSigPtr)
  84.     int signal;
  85.     int *unixSigPtr;
  86. {
  87.     if (signal >= 0 && signal <= SIG_NUM_SIGNALS) {
  88.     *unixSigPtr = spriteToUnix[signal];
  89.     return(SUCCESS);
  90.     } else {
  91.     return(FAILURE);
  92.     }
  93. }
  94.  
  95.  
  96. /*
  97.  *----------------------------------------------------------------------
  98.  *
  99.  *  Compat_UnixSigMaskToSprite --
  100.  *
  101.  *    Given a Unix signal mask, return the corresponding Sprite signal
  102.  *    mask.
  103.  *
  104.  * Results:
  105.  *    A Sprite signal mask is returned, assuming the Unix signal mask is
  106.  *    valid.
  107.  *
  108.  * Side effects:
  109.  *    None.
  110.  *
  111.  *----------------------------------------------------------------------
  112.  */
  113.  
  114. ReturnStatus
  115. Compat_UnixSigMaskToSprite(unixMask, spriteMaskPtr)
  116.     int unixMask;
  117.     int *spriteMaskPtr;
  118. {
  119.     int i;
  120.     int signal;
  121.     ReturnStatus status;
  122.  
  123.     *spriteMaskPtr = 0;
  124.     for (i = 1; i <= NSIG; i++) {
  125.     if (unixMask & sigmask(i)) {
  126.         status = Compat_UnixSignalToSprite(i, &signal);
  127.         if (status == FAILURE) {
  128.         return(FAILURE);
  129.         }
  130.         if (signal != NULL) {
  131.         *spriteMaskPtr |= Sig_NumberToMask(signal);
  132.         }
  133.     }
  134.     }
  135. #ifdef COMPAT_DEBUG
  136.     printf("Unix mask = <%x> Sprite mask = <%x>\n", 
  137.         unixMask, *spriteMaskPtr);
  138. #endif
  139.     return(SUCCESS);
  140. }
  141.  
  142.  
  143. /*
  144.  *----------------------------------------------------------------------
  145.  *
  146.  * Compat_SpriteSigMaskToUnix --
  147.  *
  148.  *    Given a Sprite signal mask, return the corresponding Unix signal
  149.  *    mask.
  150.  *
  151.  * Results:
  152.  *    A Unix signal mask is returned, assuming the Sprite signal mask is
  153.  *    valid.
  154.  *
  155.  * Side effects:
  156.  *    None.
  157.  *
  158.  *----------------------------------------------------------------------
  159.  */
  160.  
  161. ReturnStatus
  162. Compat_SpriteSigMaskToUnix(SpriteMask, UnixMaskPtr)
  163.     int SpriteMask;
  164.     int *UnixMaskPtr;
  165. {
  166.     int i;
  167.     int signal;
  168.     ReturnStatus status;
  169.  
  170.     *UnixMaskPtr = 0;
  171.     for (i = 1; i <= SIG_NUM_SIGNALS; i++) {
  172.     if (SpriteMask & Sig_NumberToMask(i)) {
  173.         status = Compat_SpriteSignalToUnix(i, &signal);
  174.         if (status == FAILURE) {
  175.         return(FAILURE);
  176.         }
  177.         if (signal != NULL) {
  178.         *UnixMaskPtr |= sigmask(signal);
  179.         }
  180.     }
  181.     }
  182.     return(SUCCESS);
  183. }
  184.  
  185.  
  186. /*
  187.  *----------------------------------------------------------------------
  188.  *
  189.  * Compat_GetSigHoldMask --
  190.  *
  191.  *    Return the current signal mask.
  192.  *
  193.  * Results:
  194.  *    The current signal mask (in Sprite terms) is returned.
  195.  *
  196.  * Side effects:
  197.  *    None.
  198.  *
  199.  *----------------------------------------------------------------------
  200.  */
  201.  
  202. #define MASK_ALL_SIGNALS 0xFFFFFFFF
  203.  
  204. ReturnStatus
  205. Compat_GetSigHoldMask(maskPtr)
  206.     int *maskPtr;
  207. {
  208.     ReturnStatus status;
  209.     Address    usp;
  210.     extern Mach_State    *machCurStatePtr;
  211.  
  212.     /*
  213.      * To modify the hold mask we need to get the old one by
  214.      * calling Sig_SetHoldMask to get the current mask.  Since we
  215.      * don't know what to set the mask to, set the mask to mask ALL 
  216.      * signals and then reset it again to the proper value.
  217.      */
  218.  
  219.     usp = (Address) (machCurStatePtr->userState.regState.regs[SP] - 4);
  220.  
  221.     status = Sig_SetHoldMask((int) MASK_ALL_SIGNALS, (int *) usp);
  222.     if (status != SUCCESS) {
  223.     return(status);
  224.     }
  225.     (void)Vm_CopyIn(sizeof(int), usp, (Address) maskPtr);
  226.     status = Sig_SetHoldMask(*maskPtr, (int *) NULL);
  227.     return(status);
  228. }
  229.